package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.ComprobantePercepcionDescuentoDAO;
import mx.ipn.persistencia.dao.DescuentoHistorialDAO;
import mx.ipn.persistencia.dao.DescuentoDAO;
import mx.ipn.to.ComprobantePercepcionDescuentoTO;
import mx.ipn.to.DescuentoHistorialTO;
import mx.ipn.to.DescuentoTO;

public class DescuentoHistorialDAOMySQL implements DescuentoHistorialDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(DescuentoHistorialDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO descuento_historial(id_descuento,id_comprobante,valor) VALUES(?,?,?)";
	private static final String UPDATE = "UPDATE descuento_historial SET id_descuento=?,id_comprobante=?,valor=? WHERE id_descuento=? and id_comprobante=?";
	private static final String FINDBYDESCUENTOCOMPROBANTE = "SELECT * FROM descuento_historial WHERE id_descuento=? and id_comprobante=?";
	private static final String SELECT = "SELECT * FROM descuento_historial";
	private static final String SELECTBYRANGOVALOR = "SELECT * FROM descuento_historial WHERE valor>=? AND valor<=?";
	private static final String SELECTBYDESCUENTO = "SELECT * FROM descuento_historial WHERE id_descuento=?";
	private static final String SELECTBYCOMPROBANTE = "SELECT * FROM descuento_historial WHERE id_comprobante=?";

	@Override
	public DescuentoHistorialTO findDescuentoHistorialByDescuentoComprobante(
			int idDescuento, int idComprobante) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYDESCUENTOCOMPROBANTE);

			ps.setInt(1, idDescuento);
			ps.setInt(2, idComprobante);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				DescuentoDAO descuentoDAO = fabricaMySQL.getDescuentoDAO();
				ComprobantePercepcionDescuentoDAO comprobantePercepcionDescuentoDAO = fabricaMySQL
						.getComprobantePercepcionDescuentoDAO();

				ArrayList<ComprobantePercepcionDescuentoTO> listComprobantePercepcionDescuentoTO = new ArrayList<ComprobantePercepcionDescuentoTO>();
				ArrayList<DescuentoTO> listDescuentoTO = new ArrayList<DescuentoTO>();

				listDescuentoTO
						.add(descuentoDAO.findDescuentoById(idDescuento));
				listComprobantePercepcionDescuentoTO
						.add(comprobantePercepcionDescuentoDAO
								.findComprobantePercepcionDescuentoById(idComprobante));
				double valor = rs.getDouble("valor");

				DescuentoTO[] arrDescuentoTO = (DescuentoTO[])listDescuentoTO.toArray(new DescuentoTO[listDescuentoTO.size()]);
				ComprobantePercepcionDescuentoTO[] arrComprobantePercepcionDescuentoTO = (ComprobantePercepcionDescuentoTO[])listComprobantePercepcionDescuentoTO.toArray(new ComprobantePercepcionDescuentoTO[listComprobantePercepcionDescuentoTO.size()]);
				
				DescuentoHistorialTO descuentoHistorialTO = new DescuentoHistorialTO(
						arrDescuentoTO, arrComprobantePercepcionDescuentoTO,
						valor);

				ps.close();
				conexion.close();
				return descuentoHistorialTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertDescuentoHistorial(
			DescuentoHistorialTO descuentoHistorialTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, descuentoHistorialTO.getIdDescuento());
			ps.setInt(2, descuentoHistorialTO.getIdComprobante());
			ps.setDouble(3, descuentoHistorialTO.getValor());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<DescuentoHistorialTO> selectDescuentoHistorial() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			DescuentoDAO descuentoDAO = null;
			ComprobantePercepcionDescuentoDAO comprobantePercepcionDescuentoDAO = null;

			ArrayList<DescuentoHistorialTO> DescuentoHistorialTO = null;
			DescuentoHistorialTO DescuentoHistorialTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (DescuentoHistorialTO == null) {
					DescuentoHistorialTO = new ArrayList<DescuentoHistorialTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					descuentoDAO = fabricaMySQL.getDescuentoDAO();
					comprobantePercepcionDescuentoDAO = fabricaMySQL
							.getComprobantePercepcionDescuentoDAO();
				}

				int idDescuento = rs.getInt("id_descuento");
				int idComprobantePercepcionDescuento = rs
						.getInt("id_comprobante");
				double valor = rs.getDouble("valor");

				ArrayList<DescuentoTO> listDescuentoTO = new ArrayList<DescuentoTO>();
				ArrayList<ComprobantePercepcionDescuentoTO> listComprobantePercepcionDescuentoTO = new ArrayList<ComprobantePercepcionDescuentoTO>();

				listDescuentoTO.add(descuentoDAO
						.findDescuentoById(idDescuento));
				listComprobantePercepcionDescuentoTO
						.add(comprobantePercepcionDescuentoDAO
								.findComprobantePercepcionDescuentoById(idComprobantePercepcionDescuento));

				DescuentoTO[] arrDescuentoTO = (DescuentoTO[])listDescuentoTO.toArray(new DescuentoTO[listDescuentoTO.size()]);
				ComprobantePercepcionDescuentoTO[] arrComprobantePercepcionDescuentoTO = (ComprobantePercepcionDescuentoTO[])listComprobantePercepcionDescuentoTO.toArray(new ComprobantePercepcionDescuentoTO[listComprobantePercepcionDescuentoTO.size()]);
				
				DescuentoHistorialTO2 = new DescuentoHistorialTO(
						arrDescuentoTO, arrComprobantePercepcionDescuentoTO,
						valor);

				DescuentoHistorialTO.add(DescuentoHistorialTO2);
			}
			ps.close();
			conexion.close();
			return DescuentoHistorialTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DescuentoHistorialTO selectDescuentoHistorialByComprobante(
			int idComprobante) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			DescuentoDAO descuentoDAO = null;
			ComprobantePercepcionDescuentoDAO comprobantePercepcionDescuentoDAO = null;

			ArrayList<ComprobantePercepcionDescuentoTO> listComprobantePercepcionDescuentoTO = null;
			ArrayList<DescuentoTO> listDescuentoTO = null;
			ArrayList<Double> listValor = null;
			

			DescuentoHistorialTO DescuentoHistorialTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYCOMPROBANTE);
			ps.setInt(1, idComprobante);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listComprobantePercepcionDescuentoTO == null) {

					listDescuentoTO = new ArrayList<DescuentoTO>();
					listComprobantePercepcionDescuentoTO = new ArrayList<ComprobantePercepcionDescuentoTO>();
					listValor = new ArrayList<Double>();
					
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					comprobantePercepcionDescuentoDAO = fabricaMySQL.getComprobantePercepcionDescuentoDAO();
					descuentoDAO = fabricaMySQL.getDescuentoDAO();
				}

				listDescuentoTO.add(descuentoDAO.findDescuentoById(rs
						.getInt("id_descuento")));
				listValor.add(rs.getDouble("valor"));

			}
			if (listDescuentoTO != null) {

				listComprobantePercepcionDescuentoTO.add(comprobantePercepcionDescuentoDAO.findComprobantePercepcionDescuentoById(idComprobante));
				
				DescuentoTO[] arrDescuentoTO = (DescuentoTO[])listDescuentoTO.toArray(new DescuentoTO[listDescuentoTO.size()]);
				ComprobantePercepcionDescuentoTO[] arrComprobantePercepcionDescuentoTO = (ComprobantePercepcionDescuentoTO[])listComprobantePercepcionDescuentoTO.toArray(new ComprobantePercepcionDescuentoTO[listComprobantePercepcionDescuentoTO.size()]);
				Double[] arrValor = (Double[])listValor.toArray(new Double[listValor.size()]);
				
				DescuentoHistorialTO = new DescuentoHistorialTO(arrDescuentoTO,
						arrComprobantePercepcionDescuentoTO, arrValor);
			}
			ps.close();
			conexion.close();
			return DescuentoHistorialTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DescuentoHistorialTO selectDescuentoHistorialByDescuento(
			int idDescuento) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;

			DescuentoDAO descuentoDAO = null;
			ComprobantePercepcionDescuentoDAO comprobantePercepcionDescuentoDAO = null;

			ArrayList<ComprobantePercepcionDescuentoTO> listComprobantePercepcionDescuentoTO = null;
			ArrayList<DescuentoTO> listDescuentoTO = null;
			ArrayList<Double> listValor = null;
			

			DescuentoHistorialTO DescuentoHistorialTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYDESCUENTO);
			ps.setInt(1, idDescuento);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listComprobantePercepcionDescuentoTO == null) {

					listDescuentoTO = new ArrayList<DescuentoTO>();
					listComprobantePercepcionDescuentoTO = new ArrayList<ComprobantePercepcionDescuentoTO>();
					listValor = new ArrayList<Double>();
					
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					comprobantePercepcionDescuentoDAO = fabricaMySQL.getComprobantePercepcionDescuentoDAO();
					descuentoDAO = fabricaMySQL.getDescuentoDAO();
				}
				
				
				listComprobantePercepcionDescuentoTO.add(comprobantePercepcionDescuentoDAO.findComprobantePercepcionDescuentoById(rs
						.getInt("id_comprobante")));
				listValor.add(rs.getDouble("valor"));

			}
			if (listDescuentoTO != null) {

				listDescuentoTO.add(descuentoDAO.findDescuentoById(idDescuento));
				
				DescuentoTO[] arrDescuentoTO = (DescuentoTO[])listDescuentoTO.toArray(new DescuentoTO[listDescuentoTO.size()]);
				ComprobantePercepcionDescuentoTO[] arrComprobantePercepcionDescuentoTO = (ComprobantePercepcionDescuentoTO[])listComprobantePercepcionDescuentoTO.toArray(new ComprobantePercepcionDescuentoTO[listComprobantePercepcionDescuentoTO.size()]);
				Double[] arrValor = (Double[])listValor.toArray(new Double[listValor.size()]);
				
				DescuentoHistorialTO = new DescuentoHistorialTO(arrDescuentoTO,
						arrComprobantePercepcionDescuentoTO, arrValor);
			}
			ps.close();
			conexion.close();
			return DescuentoHistorialTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<DescuentoHistorialTO> selectDescuentoHistorialByRangoValor(
			double inicio, double fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			DescuentoDAO descuentoDAO = null;
			ComprobantePercepcionDescuentoDAO comprobantePercepcionDescuentoDAO = null;

			ArrayList<DescuentoHistorialTO> DescuentoHistorialTO = null;
			DescuentoHistorialTO DescuentoHistorialTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYRANGOVALOR);
			
			ps.setDouble(1,inicio);
			ps.setDouble(2,fin);
			
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (DescuentoHistorialTO == null) {
					DescuentoHistorialTO = new ArrayList<DescuentoHistorialTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					descuentoDAO = fabricaMySQL.getDescuentoDAO();
					comprobantePercepcionDescuentoDAO = fabricaMySQL
							.getComprobantePercepcionDescuentoDAO();
				}

				int idDescuento = rs.getInt("id_descuento");
				int idComprobantePercepcionDescuento = rs
						.getInt("id_comprobante");
				double valor = rs.getDouble("valor");

				ArrayList<DescuentoTO> listDescuentoTO = new ArrayList<DescuentoTO>();
				ArrayList<ComprobantePercepcionDescuentoTO> listComprobantePercepcionDescuentoTO = new ArrayList<ComprobantePercepcionDescuentoTO>();

				listDescuentoTO.add(descuentoDAO
						.findDescuentoById(idDescuento));
				listComprobantePercepcionDescuentoTO
						.add(comprobantePercepcionDescuentoDAO
								.findComprobantePercepcionDescuentoById(idComprobantePercepcionDescuento));

				DescuentoTO[] arrDescuentoTO = (DescuentoTO[])listDescuentoTO.toArray(new DescuentoTO[listDescuentoTO.size()]);
				ComprobantePercepcionDescuentoTO[] arrComprobantePercepcionDescuentoTO = (ComprobantePercepcionDescuentoTO[])listComprobantePercepcionDescuentoTO.toArray(new ComprobantePercepcionDescuentoTO[listComprobantePercepcionDescuentoTO.size()]);
	
				DescuentoHistorialTO2 = new DescuentoHistorialTO(
						arrDescuentoTO, arrComprobantePercepcionDescuentoTO,
						valor);

				DescuentoHistorialTO.add(DescuentoHistorialTO2);
			}
			ps.close();
			conexion.close();
			return DescuentoHistorialTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateDescuentoHistorial(
			DescuentoHistorialTO descuentoHistorialTO,
			DescuentoHistorialTO descuentoHistorialTONuevo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, descuentoHistorialTONuevo.getIdDescuento());
			ps.setInt(2, descuentoHistorialTONuevo.getIdComprobante());
			ps.setDouble(3, descuentoHistorialTONuevo.getValor());
			ps.setInt(4, descuentoHistorialTO.getIdDescuento());
			ps.setInt(5, descuentoHistorialTO.getIdComprobante());


			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
